home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / amag / 12b92.lha / Tips & Tricks / Form. Strings (Assembler) / tip.txt < prev    next >
Text File  |  1992-11-02  |  3KB  |  81 lines

  1.  
  2. Formatierte Strings in Assembler
  3.  
  4. Welcher Assemblerprogrammierer hat nicht schon neidisch
  5. auf die Kollegen aus der C-Ecke geschaut, wenn es um
  6. formatierte Strings geht. »FormatStr.asm« macht dem nun ein Ende.
  7. Es handelt sich dabei um eine kleine Routine, die die
  8. Funktion »RawDoFmt()« aufruft. Diese unterstützt
  9. allerdings nicht alle C-spezifischen
  10. Format-Codes; es werden keine Fließkomma und
  11. Oktalzahlen unterstützt. Folgende Codes können benutzt werden:
  12.  
  13. (1) %c  -   Das nächste Argument in der Liste wird als ein Buchstabe
  14.             interpretiert. Dieser wird anstelle des %c eingesetzt.
  15. (2) %d  -   Das nächste Argument in der Liste wird als Dezimalzahl mit
  16.             Vorzeichen interpretiert. Diese wird anstelle des %d
  17.             eingesetzt.
  18. (3) %x  -   Das nächste Argument in der Liste wird als Hexadezimalzahl
  19.             interpretiert. Diese wird anstelle des %x eingesetzt.
  20. (4) %s  -   Das nächste Argument in der Liste wird als Zeiger auf einen mit
  21.             einem NULL Byte beendeten String interpretiert. Dieser wird
  22.             anstelle des %s eingesetzt.
  23.  
  24. Wenn Sie vor den Format Code ein 'l' setzen (zum Beispiel %lx) wird das
  25. zugehörige Argument als longword interpretiert. Es können auch die 
  26. folgende Zeichen in den Format Code eingefügt werden:
  27.  
  28. (1) Ein Minuszeichen bewirkt, daß das entsprechende Argument 
  29.     linksbündig in den String eingesetzt wird. (zum Beispiel %-d)
  30. (2) Eine Zahl bestimmt die maximale größe des Feldes. Was darüber hinaus
  31.     geht wird abgeschnitten (zum Beispiel %5d). Eine führende 0 bewirkt bei
  32.     einem String, daß wenn der String kleiner als die bestimmte Feldgröße
  33.     ist, alle fehlenden Zeichen durch Leerzeichen ersetzt werden (zum
  34.     Beispiel %019s). Bei Zahlen werden fehlende Ziffern durch Nullen
  35.     ersetzt (zum Beispiel %08x).
  36.  
  37. Die Argumentenübergabe gestaltet sich etwas kompliziert. Da man 
  38. ja mehr als 7 Argumente übergeben kann, fallen die Adressregister 
  39. als Übergabemöglichkeiten weg. Wir wählen den Weg über den Stack.
  40. Das geht folgendermaßen: Sie haben zum Beispiel folgenden zu 
  41. formatierenden String:
  42.  
  43.             "Mein Name ist: %s. Ich bin %d Jahre alt"
  44.  
  45. Jetzt müssen die Argumente von hinten nach vorne auf den Stack gelegt
  46. werden. Zuerst muß also das Alter auf den Stack:
  47.  
  48.             move.w      #120,-(a7)
  49.  
  50. Und dann der Name:
  51.  
  52.             pea         Name
  53.  
  54. Wobei Name mit dc.b definiert werden muß und mit einem NULL Byte endet:
  55.  
  56.             Name:       dc.b    "Ottokar",0
  57.  
  58. Jetzt liegen alle Argumente in der richtigen Reihenfolge auf dem Stack. 
  59. Nun kann, wenn alle anderen Parameter angegeben sind (siehe Listing) 
  60. aufgerufen werden. Nach Beendigung der Routine muß der Stac
  61.  
  62. k wieder korrigiert werden. Um wieviel Bytes, hängt davon ab wieviel 
  63. Argumente daraufgelegt wurden. In unserem Fall wurde er um 6 Bytes 
  64. niedriger (move.w = 2 Bytes (WORD) pea = 4 Bytes (LONGWORD)). Nun
  65. muß er also auch wieder um 6 Byte erhöht werden:
  66.  
  67.             lea     6(a7),a7
  68.  
  69. Er hat nun wieder den alten Wert. Würde das vergessen, kämen die ganzen 
  70. Rücksprungadressen durcheinander, was irgendwann einen Freiflug nach Indien 
  71. heraufbeschwört. Das Listing FormatDemo.asm soll nur als Beispiel
  72. dienen. Wichtig ist die Routine FormatStr. Das
  73. Programm läßt sich mit dem A68k (Fish 521) und Blink (Fish 351) übersetzen:
  74.  
  75.             A68K Format.asm
  76.             Blink Format.o
  77.  
  78.  
  79.  
  80.  
  81.